/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package aqu.controlador.Contabilidad;

import aqu.bean.generico.BeanGenerico;
import aqu.persistencia.Dao.Contabilidad.ConCuentaManager;
import aqu.persistencia.Dao.Contabilidad.ConNivelCuentaManager;
import aqu.persistencia.Dao.Contabilidad.ConPlanCuentasManager;
import aqu.persistencia.Dao.Contabilidad.ConTipoCuentaManager;
import aqu.persistencia.entity.ConCuenta;
import aqu.persistencia.entity.ConNivelCuenta;
import aqu.persistencia.entity.ConTipoCuenta;
import aqu.persistencia.utilidad.MessagesController;
import aqu.persistencia.utilidad.Reportes;
import com.icesoft.faces.component.ext.RowSelectorEvent;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

/**
 *
 * @author Verito Ramirez
 *         Victor Jaramillo
 */
@ManagedBean(name = "planCuentaController")
@ViewScoped
public class PlanCuentasController extends BeanGenerico {

    private ConCuenta cuenta;
    //private PlanCuentas cuenta;
    private String codigocuenta="-";
    private List<ConCuenta> lista;
    private List<ConCuenta> listaPadre;    
    private List<ConTipoCuenta> tipocuentalista;
    private List<ConNivelCuenta> nivelcuentalista;
    private ConCuentaManager cuentaManager = new ConCuentaManager();
    private ConPlanCuentasManager ConPlanCuentaManager = new ConPlanCuentasManager();
    private ConTipoCuentaManager ConTipoCuentaManager = new ConTipoCuentaManager();
    private ConNivelCuentaManager ConNivelCuentaManager = new ConNivelCuentaManager();
    private ConCuenta cuentaPadre = new ConCuenta();
    private ConTipoCuenta conTipoCue = new ConTipoCuenta();
    private ConNivelCuenta conNivelCue = new ConNivelCuenta();
    private boolean panelvisible;

    public void switchCuentaPadre(ConCuenta cuenta) {
        cuentaPadre.setConCodigopadreCue(cuenta.getConCodigopadreCue());
    }
    
    public void switchTipoCuenta(ConCuenta cuenta) {
        conTipoCue = cuenta.getConCodigoTipcue();
    }
    
    public void switchNivelCuenta(ConCuenta cuenta) {
        conNivelCue = cuenta.getConCodigoNivcue();
    }
    
    public PlanCuentasController() {
        cuenta = new ConCuenta();
        cuentaPadre = new ConCuenta();
        lista = cuentaManager.getList();
        listaPadre = cuentaManager.getListOrdenado("conCodigoCue");
        tipocuentalista = ConTipoCuentaManager.getList();
        nivelcuentalista = ConNivelCuentaManager.getList();
        panelvisible = false;
        nuevo(null);
    }

    
    public PlanCuentasController(ConCuenta cuentaPadre,ConCuenta cuenta, List<ConCuenta> lista, List<ConCuenta> listaPadre, List<ConTipoCuenta> tipocuentalista, List<ConNivelCuenta> nivelcuentalista, boolean panelvisible) {
        this.cuenta = cuenta;
        this.cuentaPadre = cuentaPadre;
        this.lista = lista;
        this.listaPadre = listaPadre;
        this.tipocuentalista = tipocuentalista;
        this.nivelcuentalista = nivelcuentalista;
        this.panelvisible = panelvisible;
    }

    public ConCuentaManager getCuentaManager() {
        return cuentaManager;
    }

    public void setCuentaManager(ConCuentaManager cuentaManager) {
        this.cuentaManager = cuentaManager;
    }

    public ConCuenta getCuentaPadre() {
        return cuentaPadre;
    }

    public void setCuentaPadre(ConCuenta cuentaPadre) {
        this.cuentaPadre = cuentaPadre;
    }

    
    public ConPlanCuentasManager getConPlanCuentaManager() {
        return ConPlanCuentaManager;
    }

    public void setConPlanCuentaManager(ConPlanCuentasManager ConPlanCuentaManager) {
        this.ConPlanCuentaManager = ConPlanCuentaManager;
    }

    public ConNivelCuenta getConNivelCue() {
        return conNivelCue;
    }

    public void setConNivelCue(ConNivelCuenta conNivelCue) {
        this.conNivelCue = conNivelCue;
    }

    public ConTipoCuenta getConTipoCue() {
        return conTipoCue;
    }

    public void setConTipoCue(ConTipoCuenta conTipoCue) {
        this.conTipoCue = conTipoCue;
    }

    

    public boolean isPanelvisible() {
        return panelvisible;
    }

    public void setPanelvisible(boolean panelvisible) {
        this.panelvisible = panelvisible;
    }

    public void llamarPanelvisible(ActionEvent event) {
        panelvisible = !panelvisible;
    }

    public List<ConCuenta> getLista() { 
        lista = ConPlanCuentaManager.getListOrdenado("conCodigoCue");
        return lista;
    }               

    public void setLista(List<ConCuenta> lista) {
        this.lista = lista;
    }
    
    public List<ConCuenta> getListaPadre() {
        listaPadre = ConPlanCuentaManager.getListOrdenado("conCodigoCue");
        return listaPadre;
    }               

    public void setListaPadre(List<ConCuenta> listaPadre) {
        this.listaPadre = listaPadre;
    }
    
    public void reporte(ActionEvent actionEvent){
        try {
            Reportes reporte = new Reportes();
            String nomArchivo = "PlanCuentas";
            Map parametro = new HashMap();
            reporte.runReporte(nomArchivo, parametro);
        } catch (Exception ex) {
            Logger.getLogger(PlanCuentasController.class.getName()).log(Level.SEVERE, null, ex);
            MessagesController.addInfo("Mensaje de error :", ex.getMessage());
            llamarPanelvisible(null);
        }
    }    
    
    public void nuevo(ActionEvent actionEvent) {
        cuenta = new ConCuenta();
    }

    public String eliminar() {
        try {
            ConCuenta cuentaTemp = (ConCuenta) (cuenta);
            if (ConPlanCuentaManager.delete(cuentaTemp) == false) {
                llamarPanelvisible(null);

            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

        return "index";

    }

    public void insertar(ActionEvent actionEvent) {
        try {
            String codigoPadre, codigoPadreTemp = "", lugarAplicacion, agrupacion, 
                    tipoCuenta, tipoCuentaTemp, codigoTemp;
            codigoTemp = cuenta.getConCodigoCue().replace(".","-");
            String[] codigos = codigoTemp.split("-");
            int numCodigos = codigos.length;
            tipoCuenta = conTipoCue.getConCodigoTipCue();
            boolean bandera = false;           
            for(int i = 0 ; i < (numCodigos-1) ; i++)
                codigoPadreTemp = codigoPadreTemp.concat(codigos[i].concat("."));
            tipoCuenta = conTipoCue.getConCodigoTipCue();
            tipoCuentaTemp = codigos[0].replace(".", "");
            codigoPadre = cuentaPadre.getConCodigopadreCue();
            String tempCodig, TempNivel;
            tempCodig = cuenta.getConCodigoCue().replace(".", "-");
            tempCodig = tempCodig.substring(tempCodig.length()-1);
            TempNivel = conNivelCue.getConCodigoNivCue();
            if( (tempCodig.equals("-") && (TempNivel.equals("2"))) || 
                    (!tempCodig.equals("-") && (TempNivel.equals("1"))) )
                throw new Exception("El Nivel de la Cuenta no concuerda con el codigo de la nueva Cuenta");
            if(tipoCuenta.equals(tipoCuentaTemp))
            {
                if(codigoPadre.equals(codigoPadreTemp))
                {
                    cuenta.setConCodigopadreCue(cuentaPadre.getConCodigopadreCue());
                    cuenta.setConCodigoNivcue(conNivelCue);
                    cuenta.setConCodigoTipcue(conTipoCue);
                    bandera = ConPlanCuentaManager.create(cuenta);
                    
                }else
                    throw new Exception("Elija el codigo de Padre correctamente..!!");
                
            }else
                throw new Exception("Elija el tipo de Cuenta correcto..!!");
            
            if (bandera == false) {
                llamarPanelvisible(null);

            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

    }

    public void modificar(ActionEvent actionEvent) {
        try {
            String codigoPadre, codigoPadreTemp = "", lugarAplicacion, agrupacion, 
                    tipoCuenta, tipoCuentaTemp, codigoTemp;
            codigoTemp = cuenta.getConCodigoCue().replace(".","-");
            String[] codigos = codigoTemp.split("-");
            int numCodigos = codigos.length;
            tipoCuenta = conTipoCue.getConCodigoTipCue();
            boolean bandera = false;           
            for(int i = 0 ; i < (numCodigos-1) ; i++)
                codigoPadreTemp = codigoPadreTemp.concat(codigos[i].concat("."));
            tipoCuenta = conTipoCue.getConCodigoTipCue();
            tipoCuentaTemp = codigos[0].replace(".", "");
            codigoPadre = cuentaPadre.getConCodigopadreCue();
            String tempCodig, TempNivel;
            tempCodig = codigoPadre.replace(".", "-");
            tempCodig = tempCodig.substring(codigoPadre.length()-1);
            TempNivel = conNivelCue.getConCodigoNivCue();
            if( (tempCodig.equals("-") && (TempNivel.equals("2"))) || 
                    (!tempCodig.equals("-") && (TempNivel.equals("1"))) )
                throw new Exception("El Nivel de la Cuenta no concuerda con el codigo de la nueva Cuenta");
            if(tipoCuenta.equals(tipoCuentaTemp))
            {
                if(codigoPadre.equals(codigoPadreTemp))
                {
                    bandera = ConPlanCuentaManager.update(cuenta);
                    
                }else
                    throw new Exception("Elija el codigo de Padre correctamente..!!");
                
            }else
                throw new Exception("Elija el tipo de Cuenta correcto..!!");
            
            if (bandera == false) {
                llamarPanelvisible(null);

            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }


    }

    public void rowSelectionListener(RowSelectorEvent event) {
        cuenta = lista.get(event.getRow());
        switchCuentaPadre(cuenta);
        switchNivelCuenta(cuenta);
        switchTipoCuenta(cuenta);
    }
    
    public ConPlanCuentasManager getConCuentaManager() {
        return ConPlanCuentaManager;
    }

    public void setConCuentaManager(ConPlanCuentasManager conPlanCuentasManager) {
        this.ConPlanCuentaManager = conPlanCuentasManager;
    }

    public ConCuenta getCuenta() {
        return cuenta;
    }

    public void setCuenta(ConCuenta cuenta) {
        this.cuenta = cuenta;
    }

    public ConNivelCuentaManager getConNivelCuentaManager() {
        return ConNivelCuentaManager;
    }

    public void setConNivelCuentaManager(ConNivelCuentaManager ConNivelCuentaManager) {
        this.ConNivelCuentaManager = ConNivelCuentaManager;
    }

    public ConTipoCuentaManager getConTipoCuentaManager() {
        return ConTipoCuentaManager;
    }

    public void setConTipoCuentaManager(ConTipoCuentaManager ConTipoCuentaManager) {
        this.ConTipoCuentaManager = ConTipoCuentaManager;
    }

    public List<ConNivelCuenta> getNivelcuentalista() {
        return nivelcuentalista;
    }

    public void setNivelcuentalista(List<ConNivelCuenta> nivelcuentalista) {
        this.nivelcuentalista = nivelcuentalista;
    }

    public List<ConTipoCuenta> getTipocuentalista() {
        return tipocuentalista;
    }

    public void setTipocuentalista(List<ConTipoCuenta> tipocuentalista) {
        this.tipocuentalista = tipocuentalista;
    }

    public String getCodigocuenta() {
        return codigocuenta;
    }

    public void setCodigocuenta(String codigocuenta) {
        this.codigocuenta = codigocuenta;
    }
}